package cn.ant.mqHandle;

import cn.ant.config.RabbitMQConfig;
import cn.ant.entity.MessageSendDTO;
import com.alibaba.fastjson2.JSONObject;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component;

import java.nio.charset.StandardCharsets;

/**
 * 生产者代码
 *
 * @author Anhui AntLaddie <a href="https://juejin.cn/user/4092805620185316">(掘金蚂蚁小哥)</a>
 * @version 1.0
 **/
@Slf4j
@Component
@RequiredArgsConstructor
public class ProducerSend {

    private final RabbitTemplate rabbitTemplate;

    /***
     * 生产者方法
     * @param msg 消息
     * @param delayTime 延迟时间
     */
    public void producerSendMsgDelay(MessageSendDTO msg, Integer delayTime) {
        //消息转换为JSON格式并转为字节数组
        byte[] bytes = JSONObject.toJSONString(msg).getBytes(StandardCharsets.UTF_8);
        //发送消息
        rabbitTemplate.convertAndSend(RabbitMQConfig.DELAYED_EXCHANGE, RabbitMQConfig.DELAYED_ROUTING_KEY, bytes,
                message -> {
                    // 这条消息的过期时间被设置过期delayTime秒（在交换机中被延迟，时间一到则被路由到队列）
                    // message.getMessageProperties().setExpiration(String.valueOf(delayTime * 1000));
                    message.getMessageProperties().setHeader("x-delay", delayTime * 1000);
                    // 说明：x-delayed-message 交换机，那你就必须用：setHeader("x-delay", delayTime * 1000)
                    // 不能用 setExpiration()，那是TTL机制的写法。
                    //设置好了一定要返回
                    return message;
                });
    }
}
